import os
import logging
from dotenv import load_dotenv
from langchain.agents import initialize_agent, AgentType
from langchain.memory import ConversationBufferWindowMemory
from langchain.prompts import MessagesPlaceholder
from langchain.schema import SystemMessage

from llm_zhipu import ZhipuAIChatLLM
from tools.search_tools import search_tools
from config.settings import validate_config

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# 加载环境变量并验证配置
load_dotenv()
try:
    validate_config()
except Exception as e:
    logger.error(f"配置验证失败: {e}")
    raise

class HealthcareAgent:
    def __init__(self):
        # 使用智谱AI LLM
        self.llm = ZhipuAIChatLLM(
            model_name="glm-4-flash",
            temperature=0.1,  # 降低温度以获得更稳定的输出
            max_tokens=2048,
            api_key=os.getenv("ZHIPU_API_KEY")
        )
        
        # 创建记忆
        self.memory = ConversationBufferWindowMemory(
            memory_key="chat_history",
            k=10,
            return_messages=True
        )
        
        # 系统提示词
        system_message = SystemMessage(content="""
        你是一个专业的健康和生活方式助手，专门帮助用户分析健康风险并提供建议。
        
        你的能力包括：
        1. 搜索最新的健康信息和医学知识
        2. 分析生活方式对健康的影响
        3. 提供个性化的健康建议
        4. 回答关于疾病预防和健康管理的问题
        
        请遵循以下原则：
        - 提供准确、科学的健康信息
        - 对于严重的健康问题，建议用户咨询专业医生
        - 尊重用户隐私，不询问过于私密的信息
        - 用友好、专业的方式与用户交流
        
        当需要最新信息时，请使用搜索工具。
        
        重要：对于简单的问题（如日期、时间等），请直接回答，不要过度使用搜索工具。
        """)
        
        try:
            # 初始化Agent - 使用CONVERSATIONAL_REACT_DESCRIPTION以获得更好的对话体验
            self.agent = initialize_agent(
                tools=search_tools,
                llm=self.llm,
                agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,  # 改为对话型Agent
                verbose=True,
                memory=self.memory,
                agent_kwargs={
                    "system_message": system_message,
                    "memory_prompts": [MessagesPlaceholder(variable_name="chat_history")],
                    "input_variables": ["input", "chat_history", "agent_scratchpad"]
                },
                handle_parsing_errors=True,
                max_iterations=3,  # 限制最大迭代次数，避免无限循环
                early_stopping_method="generate"  # 提前停止方法
            )
            logger.info("HealthcareAgent初始化成功")
        except Exception as e:
            logger.error(f"HealthcareAgent初始化失败: {e}")
            raise
    
    def chat(self, user_input: str) -> str:
        """与Agent对话"""
        try:
            # 对于简单问题，直接使用LLM回答，避免Agent循环
            simple_questions = ["今天的日期", "现在几点", "当前时间", "日期", "时间"]
            if any(q in user_input for q in simple_questions):
                logger.info("检测到简单问题，直接使用LLM回答")
                from datetime import datetime
                now = datetime.now()
                if "日期" in user_input:
                    return f"今天是{now.strftime('%Y年%m月%d日')}"
                elif "时间" in user_input or "几点" in user_input:
                    return f"现在是{now.strftime('%H点%M分')}"
            
            response = self.agent.run(user_input)
            return response
        except Exception as e:
            logger.error(f"Agent对话过程中出错: {e}")
            return f"抱歉，处理您的请求时出现了错误: {str(e)}"

def main():
    """主函数 - 测试Agent"""
    print("=" * 60)
    print("          健康与生活方式助手 Agent")
    print("=" * 60)
    print("注意：本助手提供的信息仅供参考，不能替代专业医疗建议")
    print("输入 '退出' 或 'quit' 结束对话")
    print("-" * 60)
    
    try:
        # 创建Agent实例
        agent = HealthcareAgent()
        
        while True:
            try:
                user_input = input("\n👤 您: ").strip()
                
                if user_input.lower() in ['退出', 'quit', 'exit']:
                    print("\n🤖 助手: 感谢使用！祝您健康！")
                    break
                    
                if not user_input:
                    continue
                
                print("\n🤖 助手: ", end="", flush=True)
                response = agent.chat(user_input)
                print(response)
                
            except KeyboardInterrupt:
                print("\n\n🤖 助手: 对话已中断，再见！")
                break
            except Exception as e:
                print(f"\n🤖 助手: 抱歉，出现了意外错误: {str(e)}")
    
    except Exception as e:
        print(f"初始化Agent失败: {e}")
        print("请检查：")
        print("1. ZHIPU_API_KEY环境变量是否正确设置")
        print("2. 网络连接是否正常")
        print("3. 依赖包是否正确安装")

if __name__ == "__main__":
    main()